perm filename MKVID1[2,BGB] blob
sn#051788 filedate 1973-07-03 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00008 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE MKVID1 - MAKE VIDEO TYPE 1.
C00004 00003 SUBR(TFILL) TRIANGLE FILL.
C00007 00004 SUBR(FILL)
C00010 00005 SUBR(ADDSKY) ADD SPAN INTO THE SKY ARRAY.
C00012 00006 SUBR(TVDSKO) INPUT TV PICTURE FROM A DISK FILE.
C00014 00007 SUBR(PACKTV) PACK SKY RASTER INTO TV BUFFER.
C00015 00008 DATA AREA.
C00017 ENDMK
C⊗;
TITLE MKVID1 - MAKE VIDEO TYPE 1.
;B.G.BAUMGART - 1 JULY 1973.
COMMENT ⊗
The design goal for this program is to make high
quality video images from polygons (triangles) in the
simplest possible way. The jaggies problem is solved by
brute force summation of 64 micro pixels per usual pixel.
The intensity of a region is determined by two linear
interpolations, (along edges, and along scan line).
⊗
;MAIN LOOP.
SA:
CALL(TFILL) ;FILL ALL THE TRIANGLES.
CALL(PACKTV) ;PACK SKY ARRAY INTO TV BUFFER.
CALL(TVDSKO) ;OUTPUT TV BUFFER TO DISK FILE.
EXIT
;FILL ARGUMENTS.
DECLARE{COL1,COL2,COL3} ;MICRO COL. 0.0,,0
DECLARE{ROW1,ROW2,ROW3} ;MICRO ROW. 0.0
DECLARE{BRT1,BRT2,BRT3} ;BRIGHTNESS 00.0000
DECLARE{DELC1,DELC2,DELC3} ;DELTA COLUMN.
DECLARE{DELB1,DELB2,DELB3} ;DELTA BRIGHTNESS.
SUBR(TFILL) ;TRIANGLE FILL.
BEGIN TFILL;_________________________________________________________
ACCUMULATORS{N,V1,V2,V3,R1,R2,R3,C1,C2,C3,B1,B2,B3}
;PICKUP A TRIANGLE.
L1: LAC V1,TPTR↔SKIPGE(V1)↔POP0J ;EXIT AT END OF LIST.
LACI V2,2(V1)
LACI V3,2(V2)
LACI 1,2(V3)↔DAC 1,TPTR
;ORDER THE VERTICES.
LAC(V1)↔CAMLE(V2)↔EXCH V1,V2
LAC(V1)↔CAMLE(V3)↔EXCH V1,V3
LAC(V2)↔CAMLE(V3)↔EXCH V2,V3
LAC 1,COLOR
;PICKUP & PLACE BINARY POINTS FOR COLUMN, ROW AND BRIGHTNESS.
L2: FOR @$ I←1,3{
CDR C$I,(V$I)↔LSH C$I,=15
CAR R$I,(V$I)↔LSH R$I,-3
LAC B$I,1(V$I)↔LSH B$I,(1)↔ANDI B$I,7770↔MOVSS B$I}
;COMPUTE DELTA'S.
L3: LAC N,R1↔SUB N,R2
LAC C1↔SUB C2↔SKIPE N↔IDIV N↔DAC DELC1
LAC B1↔SUB B2↔SKIPE N↔IDIV N↔DAC DELB1
LAC N,R1↔SUB N,R3
LAC C1↔SUB C3↔SKIPE N↔IDIV N↔DAC DELC2
LAC B1↔SUB B3↔SKIPE N↔IDIV N↔DAC DELB2
LAC N,R2↔SUB N,R3
LAC C2↔SUB C3↔SKIPE N↔IDIV N↔DAC DELC3
LAC B2↔SUB B3↔SKIPE N↔IDIV N↔DAC DELB3
;SETUP FILL ARGUMENTS.
L4: DAC R1,ROW1↔DAC R2,ROW2↔DAC R3,ROW3
DAC C1,COL1↔DAC B1,BRT1↔DAC C1,COL2↔DAC B1,BRT2
SETOM CCWFLG↔LAC DELC1↔CAMG DELC2↔GO .+8
SETZM CCWFLG
LAC DELC1↔EXCH DELC2↔DAC DELC1
LAC DELB1↔EXCH DELB2↔DAC DELB1
;MAKE UPPER AND LOWER CALLS ON FILL SUBROUTINE.
L5: CALL(FILL)
LAC 0,DELC3↔LAC 1,DELB3
SKIPN CCWFLG↔GO .+4
DAC 0,DELC1↔DAC 1,DELB1↔GO .+3
DAC 0,DELC2↔DAC 1,DELB2
LAC ROW2↔DAC ROW1
LAC ROW3↔DAC ROW2
CALL(FILL)
GO L1
BEND TFILL;BGB 2 JULY 1973.__________________________________________
SUBR(FILL)
BEGIN FILL;__________________________________________________________
;FILL MICRO ROWS (R1+1) INCLUSIVE TO R2.
;FILL MICRO PIXELS C1 INCLUSIVE TO (C2-1).
ACCUMULATORS{ROW,COL,R,C,C1,C2,B1,B2,CMIN,CMAX}
;PICKUP ARGUMENTS.
LAC C1,COL1↔LAC C2,COL2
LAC B1,BRT1↔LAC B2,BRT2
LAC R,ROW1 ;FIRST MICRO ROW.
LAC ROW,R↔LSH ROW,-3 ;FIRST MACRO ROW.
SLACI CMIN,=288⊗3↔SETZ CMAX,
;ADVANCE SEGMENT A MICRO ROW.
L1: ADD C1,DELC1↔CAMGE C1,CMIN↔DAC C1,CMIN
ADD C2,DELC2↔CAMLE C2,CMAX↔DAC C2,CMAX
ADD B1,DELB1↔ADD B2,DELB2↔AOS R
;DELTA MICRO COLUMNS INTO AC1.
L2: CAR 0,C2↔CAR 1,C1
SUB 1,0↔JUMPGE 1,L4 ;IGNORE THIN (OR BACKWARDS) SEGMENTS.
CAR C,C1↔DIP 1,C ;SETUP MICRO COLUMN AOBJN POINTER.
;DELTA BRIGHTNESS PER MICRO COLUMN INTO AC0.
LAC B1↔SUB B2
SKIPE↔IDIV 1
LAC 1,B1
CAR COL,C1↔LSH COL,-3↔GO .+3 ;FIRST MACRO COLUMN.
;INNER MOST LOOP.
L3: TRNN C,7↔AOS COL
ADDM 1,SPAN(COL) ;ADD BRIGHTNESS OF ONE MICRO PIXEL.
ADD 1,0 ;DELTA BRIGHTNESS PER MICRO PIXEL.
AOBJN C,L3
;ADVANCE MICRO ROW.
L4: LDB 0,[POINT 3,R,35]
CAMGE R,ROW2 ;LAST ROW OR BEYOND OR
CAIN 0,7↔CALL(ADDSKY) ;OR MACRO ROW BOUNARY.
;SAVE & EXIT.
CAMGE R,ROW2↔GO L1
DAC C1,COL1↔DAC C2,COL2
DAC B1,BRT1↔DAC B2,BRT2
POP0J
BEND FILL;BGB 3 JULY 1973.___________________________________________
SUBR(ADDSKY) ;ADD SPAN INTO THE SKY ARRAY.
BEGIN ADDSKY;________________________________________________________
ACCUMULATORS{ROW,COL,R,C,C1,C2,B1,B2,CMIN,CMAX}
; ROW & COL MACRO PIXEL LOCUS.
; R & C MICRO PIXEL LOCUS.
; C1 & C2 LEFT AND RIGHT COLUMNS OF SCAN LINE SEGMENT.
; B1 & B2 LEFT AND RIGHT BRIGHTNESS OF " " " .
; CMIN & CMAX MICRO COLUMN EXTREMA PER MACRO ROW.
; 14 15 16 P
;GET COLUMN EXTREMA INTO MACRO PIXEL UNITS.
LSH CMIN,-=21
LSH CMAX,-=21
LAC COL,CMIN
;ADD SPAN PIXELS TO SKY ARRAY AND CLEAR SPAN PIXELS.
L1: XCT GETSKY(ROW);(COL)
CAR 1,SPAN(COL)↔ADD 0,1
DZM SPAN(COL)
TLNE -1↔HLLOI ;SKY PIXEL OVERFLOW.
XCT PUTSKY(ROW);(COL)
CAMGE COL,CMAX
AOJA COL,L1
;INCREMENT MACRO ROW.
AOS ROW
;RESET COLUMN EXTREMA.
SLACI CMIN,=288⊗3↔SETZ CMAX,
POP0J
BEND ADDSKY;BGB 2 JULY 1973.__________________________________________
SUBR(TVDSKO) INPUT TV PICTURE FROM A DISK FILE.
BEGIN TVDSKO;-----------------------------------------------------
;GET FILENAME.
; CALL(GETFIL,[SIXBIT/TMP/],[SIXBIT/DATBGB/])↔POP0J
LAC[SIXBIT/VIDEO/]↔DAC FILNAM
LAC[SIXBIT/TMP/]↔DAC EXTION
SETZM EXTION+1
LAC[SIXBIT/DATBGB/]↔DAC PPPN
;INITIALIZE DISK.
INIT 1,17↔SIXBIT/DSK/↔0↔HALT
ENTER 1,FILNAM↔GO[OUTSTR[ASCIZ/ ENTER FAILED.
/]↔GO .+4]
;CLEAR AND RESET HEADER.
LAC[XWD HEADER,HEADER+1]↔DZM HEADER↔BLT HEADER+177
LAC[XWD HEAD1,HEADER]↔BLT HEADER+7
;DUMP MODE OUTPUT TO DISK.
OUT 1,DUMARG↔JFCL
OUTSTR[ASCIZ" EOF.
"]↔ RELEASE 1,↔POP0J
;CRE-STANDARD TELEVISION FILE HEADER.
HEAD1: -1
6 ; BITS PER BYTE.
=48 ;WORDS PER LINE.
=20 ;FIRST AND LAST ROW.
=235
=28
=315 ;FIRST AND LAST COL.
XWD -=10368,200
DUMARG: IOWD 24400,HEADER↔0
BEND TVDSKO; BGB 1 JULY 1973 -------------------------------------
FILNAM: 0
EXTION: 0
0
PPPN: 0
SUBR(PACKTV) ;PACK SKY RASTER INTO TV BUFFER.
BEGIN PACKTV;________________________________________________________
ACCUMULATORS{ROW,COL,PTR,I}
SETZ I,
LAC PTR,[POINT 6,TVBUF]
SETZ ROW,
L1: SETZ COL,
L2: XCT GETSKY(ROW);(COL) BRIGHTNESS 00.0000
CAIGE 770000 ;ALREADY BRIGHT ENOUGH.
ADD RROUND(I) ;RANDOM ROUNDING.
SOSGE I↔LACI I,=100
LSH -=12↔IDPB PTR ;TRUNCATE AND PACK.
CAIGE COL,=287↔AOJA COL,L2
CAIGE ROW,=215↔AOJA ROW,L1
POP0J
RROUND: FOR I←0,=100{4000
}
BEND PACKTV;BGB 2 JULY 1973._________________________________________
;DATA AREA.
CCWFLG: 0 ;ORIENTATION OF TRIANGLE'S VERTICES.
COLOR: 3 ;COLOR BYTE SHIFT.
;TRIANGLE LIST.
TPTR: .+1
TLIST:
XWD =10⊗6,=20⊗6↔100
XWD =100⊗6,=5⊗6↔300
XWD =200⊗6,=200⊗6↔700
XWD =10⊗6,=200⊗6↔700
XWD =120⊗6,0↔300
XWD =200⊗6,=100⊗6↔100
-1
;CRE STANDARD TV FILE IS =10496 WORDS LONG, 24400 OCTAL.
;=128 WORD HEADER, =216 ROWS OF =288 COLUMNS OF 6 BITS PER PIXEL.
HEADER: BLOCK =128
TVBUF: BLOCK =10368 ;TV BUFFER 6 BITS PER PIXEL.
SPAN: BLOCK =288 ;SCAN LINE BUFFER.
;POINTERS TO TV BUFFER.
POINT 6,-1,29 ;COLUMN -2.
POINT 6,-1,35 ;COLUMN -1.
COLPTR: FOR I←0,=48{
I+<POINT 6,0,05>↔I+<POINT 6,0,11>↔I+<POINT 6,0,17>
I+<POINT 6,0,23>↔I+<POINT 6,0,29>↔I+<POINT 6,0,35>}
ROWPTR: FOR I←0,=216{
I*=48+TVBUF}
;POINTER TO SKY ARRAY - 216 ROWS OF 288 COLUMNS OF 18 BIT BYTES.
PUTSKY: FOR I←0,=107{ DIP 0,SKY+=288*I(3)
} FOR I←0,=107{ DAP 0,SKY+=288*I(3)
} GETSKY: FOR I←0,=107{ CAR 0,SKY+=288*I(3)
} FOR I←0,=107{ CDR 0,SKY+=288*I(3)
}
SKY: BLOCK =31104
END SA